Apollo Client
Apollo Client is a comprehensive state management library for JavaScript. (Apollo Client は JavaScript のための 包括的 な状態管理ライブラリです。) 包括的な状態管理ライブラリ
アプリケーションの状態管理においてひと通り必要な機能が揃っている意 radish-miyazaki.icon
It enables you to manage both local and remote data with GraphQL. (これを使用することで、ローカルおよびリモートのデータをGraphQLを使って管理することができます。)
Use it to fetch, cache, and modify application data, all while automatically updating your UI.
(アプリケーションのデータを取得、キャッシュ、変更しながら、UIを自動的に更新してくれるという機能を持っています。)
GraphQL で取得したデータが変更された場合、その変更を元に UI を自動的に更新してくれる radish-miyazaki.icon Apollo Client の利用
ApolloClient のインスタンスの作成
code:ts
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache(),
});
link: 使用するすべての Link(後述)を concat で連結して渡す
cache: クエリの結果をキャッシュとして保存するために用いる
作成した Client を利用するコンポーネントを、<ApolloProvider> でラップする
client Props に作成した Client を渡す code:src/App.tsx
function App() {
return (
<ApolloProvider client={client}>
<RouterProvider router={router} />
</ApolloProvider>
);
}
code:jsx
const { loading, error, data } = useQuery(gql`
query GetDogs {
dogs {
id
breed
}
}
`);
code:jsx
mutation IncrementCounter {
currentValue
}
`);
関数コンポーネントの外で処理したい場合
ApolloClient の query / mutate メソッドを実行することで実現できるっぽい? radish-miyazaki.icon
Apollo Link Architecture
Link とは
GraphQL サーバとの HTTP リクエスト・レスポンスのフローを管理・制御するためのインタフェース
ミドルウェア のように動作し、リクエストを修正したり、レスポンスを処理したり、エラーハンドリングを追加したりすることが可能 https://maku.blog/p/xa62yo4/img-001.drawio.svg
組み込みの Link(一部)
HTTP を介して GraphQL リクエストを送信するための Link
デフォルトで使用される Link
code:js
import { HttpLink } from '@apollo/client';
const link = new HttpLink({
});
エラーのキャッチと処理を行うための Link
code:js
import { onError } from "@apollo/client/link/error";
// Log any GraphQL errors or network error that occurred
const errorLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors)
graphQLErrors.forEach(({ message, locations, path }) =>
console.log(
[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}
)
);
if (networkError) console.log([Network error]: ${networkError});
});
ネットワークエラーが発生した際にリクエストを再試行するための Link
code:js
import { RetryLink } from "@apollo/client/link/retry";
const link = new RetryLink();
複数のリクエストを 1 つのバッチにまとめて送信するための Link
code:js
import { BatchHttpLink } from "@apollo/client/link/batch-http";
const link = new BatchHttpLink({
batchMax: 5, // No more than 5 operations per batch
batchInterval: 20 // Wait no more than 20ms after first batched operation
});
カスタム Link を作成することもできる
認証トークンを Authorization リクエストヘッダに付与する
code:jsx
import { setContext } from '@apollo/client/link/context';
const authLink = setContext((_, { headers }) => {
const token = localStorage.getItem('authToken');
return {
headers: {
...headers,
authorization: token ? Bearer ${token} : "",
}
};
});